package com.audaque.springboot.foshanupload.web.servletdemo.controller.context;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 Web组件之间的跳转:web组件(Servlet/JSP/Filter/Listener),将一个完整的功能由多个web组件配置完成
 * */
@WebServlet("/servletcontext/a")
public class AServlet extends HttpServlet{
	private static final long serialVersionUID = 4993112101987329614L;

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("---before---a");
		PrintWriter out=resp.getWriter();
		out.print("---before---a");

		//ServletContext:表示当前应用对象,他在服务器打开创建,关闭服务器销毁
		//1.获取ServletContext对象
		//在Servlet类中,可以直接调用ServletConfig接口中的getServletContext()方法获取ServletContext对象
		ServletContext ctx=super.getServletContext();
		System.out.println(ctx);
		//不是在Servlet类中
        ServletContext ctx2 = req.getServletContext();//从Servlet3.0之后支持
        System.out.println(ctx2);
        ServletContext ctx3 = req.getSession().getServletContext();//以前的最古老的方式
        System.out.println(ctx3);
/*		操作作用域：
		设置共享数据
		void setAttribute(String name, Object object)
		获取共享数据
		Object getAttribute(String name)
		修改共享数据
		重新设置一个同名的共享数据
		删除共享数据
		void removeAttribute(String name) */
        ctx.setAttribute("USER_IN_SESSION", "china");
        System.out.println(ctx.getContextPath());//获取上下文路径  (也可以使用request对象.getContextPath())
        System.out.println(ctx.getRealPath("/login.html"));//根据指定的相对路径获取绝对路径(上传/下载)
        /*
		以前,在Servlet中如果有硬编码,那么在当前的Servlet中配置初始化参数
		然后使用ServletConfig---getInitParameter(String name)获取;
		问题:如果在多个Servlet中有相同的初始化参数,.那么该如何配置?---->使用全局的初始化参数
		获取全局初始化参数的方法:
		ServletConfig:获取当前的Servlet中的初始化参数,不能够获取全局的初始化参数
		ServletContext:获取全局初始化参数
		request:
  		getParameter(String name):获取用户提交的数据
  		getAttribute(String name):获取程序猿设置的共享数据
		*/
        System.out.println(ctx.getInitParameter("username"));
        System.out.println(ctx.getInitParameterNames());

		//跳转
		//2.URL重定向（redirect）:能访问其他项目的资源，相当于直接在主机地址拼接上下文路径/资源名称
		//URL重定向的特点:1.整个有两次请求
	  	resp.sendRedirect("/forward_redirect_scope_jsp/servletcontext/b");//参数:location,指定要跳转到的资源路径(上下文路径/资源名称 ）
		//URL重定向的特点:4.不可以访问WEB-INF中的资源
		//resp.sendRedirect("//forward_redirect_scope_jsp/WEB-INF/login.html");//参数:path,指定要跳转到的资源路径
		//URL重定向的特点:5.能跨域访问
		//resp.sendRedirect("https://www.baidu.com");//参数:path,指定要跳转到的资源路径

  		System.out.println("---after---a");
		out.print("---after---a");

	}
}
